from __future__ import division
import numpy as np
'''#轮盘赌算法:
将一个种群排列好(排列顺序随机)，每个个体用一个线段表示，线段的长度与适应度值成正比。
将表示每个个体的线段合并成一条直线(长度为L)，那么适应度值高的个体所在区间就很大，适应度值小的个体所在区间就小。
随机产生一个在[0,L]之间的数x，x落在哪个区间，就选择那个区间代表的个体。
'''
class Selection(object):
    def RouletteSelection(self, _a, k):#_a表示适应度值，k表示选择出来的个数
        a = np.asarray(_a)
        idx = np.argsort(a)
        idx = idx[::-1]
        sort_a = a[idx]
        sum_a = np.sum(a).astype(np.float)
        selected_index = []
        for i in range(k):
            u = np.random.rand()*sum_a
            sum_ = 0
            for i in range(sort_a.shape[0]):
                sum_ +=sort_a[i]
                if sum_ > u:
                    selected_index.append(idx[i])
                    break
        return selected_index#返回的是索引


if __name__ == '__main__':
    s = Selection()
    a = [1, 3, 2, 1, 4, 4, 5]
    selected_index = s.RouletteSelection(a, k=20)

    new_a =[a[i] for i in selected_index]
    print(list(np.asarray(a)[selected_index]))
    print(new_a)






